<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
//      Promise实例生成后，可以用then方法 分别指定resolved状态和rejected状态的回调函数 
//      Promise实例具有then方法, 就是说这个then方法是定义在原型对象上的Promise.prototype

            // promise.then(function(value) {
            //     // success
            //     }, function(error) {
            //     // failure
            // });

//      then方法可以接收两个回调函数作为参数 作用是->为Promise实例添加状态改变时的回调时的函数 
//      第一个回调函数是Promise对象的状态   变为resolved时调用 
//      第二个回调函数是Promise对象的状态   变为rejicted时调用 
//     !注意这俩个函数都是可选的，不一定得提供，它们都是接收Promise对象传出的值作为参数    

        //demo如下
        function timeout(ms){
            return new Promise((resolve,reject)=>{          //timeout函数房交会一个Promise实例 即一段时间以后才会发生的结果
                setTimeout(resolve, ms, "dnoe")             //过了指定的时间(ms参数)后  Promise实例状态变为resolved 就会触发then方法绑定的回调函数
            })
        }
        timeout(100)
        .then((value)=>{                //注意then方法返回的是一个新的Promise实例(不是原来那个实例哟!)
            console.log(value)          
        })
        //.then...then..then            //因此可以采用链式写法不断.then调用(即回调黑洞变成了火车回调)

//Promise 新建立后会立即执行的 
        let promise = new Promise(function(resolve, reject) {
            console.log('Promise');
            resolve();
        });
        promise.then(function() {       //然后.then指定回掉函数 在当前脚本所有的同步执行完才会执行 
            console.log('resolved.');   //所以relolved最后输出了 
        }); 
            console.log('Hi!');
        // Promise          所以首先输出的是Promise
        // Hi!
        // resolved

        //demo中p1和p2 都是Promise的实例 
            // const p1 = new Promise(function (resolve, reject) {
            // // ...
            // });
            // const p2 = new Promise(function (resolve, reject) {
            // // ...
            // resolve(p1);   //!在这里p2的reloved方法将p1做为参数 即一个异步操作的结果是返回另一个异步操作
            // })
        // ! 注意 这时候p1 的状态就会传递至p2 就是说 p1的状态决定了p2的状态 
        // 如果p1的状态是 pending               那么p2的回调函数就会等待p1的状态改变   
        // 如果p1的状态是 resolved/rejected     那么p2 的回调函数将会立刻执行  
        //demo示例 
        const p1 = new Promise(function (resolve, reject) {
            setTimeout(() => reject(new Error('fail')), 3000)   //实例p1在这儿 3s延迟后抛出错误 
        })
        const p2 = new Promise(function (resolve, reject) {     //实例p2在这儿 1s后传入了p1的实例 即执行去
            setTimeout(() => resolve(p1), 1000)
        })
        p2
        .then(result => console.log(result))
        .catch(error => console.log(error))
        // Error: fail

        // 一般来说，调用resolve或reject以后，Promise 的使命就完成了，后继操作应该放到then方法里面，而不应该直接写在resolve或reject的后面。
        //  所以，最好在它们前面加上return语句，这样就不会有意外。
        new Promise((resolve, reject) => {
            return resolve(1);
            // 后面的语句不会执行
            console.log(2);
        })


</script>